#ifndef WAKE_WORD_DETECT_H
#define WAKE_WORD_DETECT_H

// 包含必要的头文件
#include <freertos/FreeRTOS.h>  // FreeRTOS操作系统
#include <freertos/task.h>      // FreeRTOS任务管理
#include <freertos/event_groups.h>  // FreeRTOS事件组

#include <esp_afe_sr_models.h>  // ESP32音频前端和语音识别模型
#include <esp_nsn_models.h>     // ESP32噪声抑制模型

#include <list>
#include <string>
#include <vector>
#include <functional>
#include <mutex>
#include <condition_variable>

#include "audio_codec.h"  // 音频编解码器

// 唤醒词检测类
class WakeWordDetect {
public:
    WakeWordDetect();  // 构造函数
    ~WakeWordDetect(); // 析构函数

    // 初始化唤醒词检测
    void Initialize(AudioCodec* codec);
    
    // 输入音频数据
    void Feed(const std::vector<int16_t>& data);
    
    // 设置唤醒词检测回调函数
    void OnWakeWordDetected(std::function<void(const std::string& wake_word)> callback);
    
    // 开始检测
    void StartDetection();
    
    // 停止检测
    void StopDetection();
    
    // 检查是否正在检测
    bool IsDetectionRunning();
    
    // 获取输入数据大小
    size_t GetFeedSize();
    
    // 编码唤醒词数据
    void EncodeWakeWordData();
    
    // 获取唤醒词Opus编码数据
    bool GetWakeWordOpus(std::vector<uint8_t>& opus);
    
    // 获取最后检测到的唤醒词
    const std::string& GetLastDetectedWakeWord() const { return last_detected_wake_word_; }

private:
    esp_afe_sr_iface_t* afe_iface_ = nullptr;  // 音频前端接口
    esp_afe_sr_data_t* afe_data_ = nullptr;    // 音频前端数据
    char* wakenet_model_ = NULL;               // 唤醒词模型
    std::vector<std::string> wake_words_;      // 唤醒词列表
    EventGroupHandle_t event_group_;           // 事件组句柄
    std::function<void(const std::string& wake_word)> wake_word_detected_callback_;  // 唤醒词检测回调函数
    AudioCodec* codec_ = nullptr;              // 音频编解码器实例
    std::string last_detected_wake_word_;      // 最后检测到的唤醒词

    // 唤醒词编码相关
    TaskHandle_t wake_word_encode_task_ = nullptr;  // 编码任务句柄
    StaticTask_t wake_word_encode_task_buffer_;     // 编码任务缓冲区
    StackType_t* wake_word_encode_task_stack_ = nullptr;  // 编码任务栈
    std::list<std::vector<int16_t>> wake_word_pcm_;      // PCM格式唤醒词数据
    std::list<std::vector<uint8_t>> wake_word_opus_;     // Opus格式唤醒词数据
    std::mutex wake_word_mutex_;                        // 唤醒词数据互斥锁
    std::condition_variable wake_word_cv_;              // 唤醒词数据条件变量

    // 存储唤醒词数据
    void StoreWakeWordData(uint16_t* data, size_t size);
    
    // 音频检测任务
    void AudioDetectionTask();
};

#endif
